package com.tinygray.lock;

/**
 * @Author: tinygray
 * @Description: 公众号:Madison龙少，关注我你会越来越优秀。
 * @className: SeamphoreDemo
 * @create: 2021-05-08 20:02
 */

import java.util.concurrent.Semaphore;

/**
 * 信号量：类似吃饭排队 等里面人吃完 再进去 在等  再进 。。。。
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);//模拟三个停车位
        for (int i = 0; i < 6; i++) {//模拟六辆车
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t 抢到车位。。。");
                    //暂停一会线程
                    Thread.currentThread().join(3000);
                    System.out.println(Thread.currentThread().getName()+"\t 停到三秒钟后离开。。。");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //释放停车位
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}
/*他们的实际业务场景：
Semaphore保证同一时间下最大并发数，可用于流量控制；
CountDownLatch可用多个线程对excel多个worksheet并发读取最后进行某些操作，如汇总所有行的总数量
CyclicBarrier可自动重置，实际应用暂未找到，但是可以用一个例子来比喻，它可用于重复性的多线程分工后整合的工作，如车辆的加工和生产，等所有零件各自生产完，最后才一起进行组装

*/
